/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package core;

import com.sun.lwuit.Form;
import datamodel.Message;
import java.util.Vector;
import network.Connection;
import network.packets.MessageResponce;
import network.packets.MessagesArchiveResponce;
import network.packets.Packet;
import view.MessageForm;
import view.MessagesListForm;

/**
 *
 * @author Kvest
 */
public class MessageManager 
{
    private static MessageManager manager = null;;
    private static final Object lock = new Object();
    
    public static MessageManager getManager()
    {
        synchronized(lock)
        {
            if (manager == null)
            {
                manager = new MessageManager();
            }
        }
        
        return manager;
    }
    
    private Vector messages;
    
    private MessageManager()
    {
        messages = new Vector();
        
        //Подписываемся на пакет получения сообщения по сети
        registerNetworkNotifiers();
    }
    
    private void registerNetworkNotifiers()
    {
        //Получение нового сообщения
        Connection.getConnection().setPacketListener(Packet.MESSAGE_RESPONCE, new Connection.PacketNotifier() 
        {
            public void incomingPacket(Packet packet) 
            {
                MessageResponce responce = (MessageResponce)packet;
                
                Message newMessage = responce.getMessage();
                
                //Добавляем сообщение в коллекцию
                messages.addElement(newMessage);
                
                //Проигрываем музыку
                MediaManager.getManager().playMusic(Settings.getSettings().getMessageMelodyId());
        
                //Отображаем форму с сообщением
                showNewMessageForm(newMessage);
            }
        });
        
        //Получения архива сообщений
        Connection.getConnection().setPacketListener(Packet.MESSAGES_ARCHIVE_RESPONCE, new Connection.PacketNotifier() 
        {
            public void incomingPacket(Packet packet) 
            {
                MessagesArchiveResponce responce = (MessagesArchiveResponce)packet;
                
                //Добавляем сообщения в архив
                for (int i = 0; i < responce.getCount(); ++i)
                {
                    messages.insertElementAt(responce.getMessage(i) , 0);
                }
                    
                //Если текущая форма список сообщений - обновляем ее
                Form shownForm = ScreenEngine.getEngine().getCurrent();
                if (shownForm instanceof MessagesListForm)
                {
                    ((MessagesListForm)shownForm).updateContent();
                }
            }
        });
    }
    
    private void showNewMessageForm(Message message)
    {
        //Получаем форму
        MessageForm messageForm = MessageFormPool.getPool().getMessageForm();
       
        //Устанавливаем сообщение
        messageForm.setContent(message);
        
        //Отображаем
        ScreenEngine.getEngine().push(messageForm);
    }
    
    public void addMessage(Message message)
    {
        //Добавляем сообщение в коллекцию
        messages.addElement(message);
    }
    
    public int getCount()
    {
        return messages.size();
    }
    
    public Message getMessageByIndex(int index)
    {
        return (Message)messages.elementAt(index);
    }
    
    public Message getMessage(int id)
    {
       for (int i = 0; i < messages.size(); ++i)
       {
           if (getMessageByIndex(i).getId() == id)
           {
               return getMessageByIndex(i);
           }
       }
       
       return null;
    }
}
